import { setRequestConfig, setInterceptor } from 'microvideo-request'
import Cookies from 'js-cookie'
import { successCode, authKey } from '@/config'
import { isArray } from '@/utils/validate'
import { message } from 'ant-design-vue'

/**
 * @description 处理code异常
 * @param {*} code
 * @param {*} msg
 * @param {*} data 接口返回数据
 */
const handleCode = (code, msg, data) => {
  switch (code) {
    case 400:
      message.error(msg || `请求参数错误`)
      break
    case 401:
      message.error(msg || `授权未通过`)
      break
    case 406:
      message.error(msg || `权限认证未通过`)
      break
    case 500:
      message.error(msg || `服务器意外错误`)
      break
    case 501:
      message.error(msg || `服务器不支持该请求功能`)
      break
    default:
      message.error(msg || `后端接口${code}异常`)
      break
  }
}

/**
 * 请求配置
 * 基本配置，多服务配置，拦截器配置
 * @author 朱琦
 * @time 2022/5/18
 **/

export const requestConfig = {
  /**
   * 基本配置
   */
  config: {
    baseURL: process.env.VUE_APP_BASE_API,
    headers: {
      'microvideo-device': 'microvideo-weixin-not-auth'
    }
  },

  /**
   * 多服务配置
   */
  servers: [
    {
      // 可视化大屏
      name: 'BASE_SERVER',
      url: process.env.VUE_APP_BASE_API
    },
    {
      // 拿线上json文件
      name: 'STATIC_DATA',
      url: process.env.VUE_APP_STATIC_DATA_API
    },
    {
      // 系统管理字典服务
      name: 'XTGL',
      url: process.env.VUE_APP_XTGL
    },
    {
      // 智能侦测
      name: 'ZNZC',
      url: process.env.VUE_APP_ZNZC
    },
    {
      // 认证服务
      name: 'AUTH',
      url: process.env.VUE_APP_AUTH
    },
    {
      // 综合分析
      name: 'ZHFX_SERVER',
      url: process.env.VUE_APP_ZHFX_API
    },
    {
      // 大屏管理
      name: 'MANAGE_SERVER',
      url: process.env.VUE_APP_MANAGE_API
    },
    {
      // 桥面监测
      name: 'QMJC_SERVER',
      url: process.env.VUE_APP_NJY_API
      // url: '/qmjc-api'
    }
  ],
  /**
   * 请求之前回调
   * @param {Object} res
   */
  before: (res, resolve, reject) => {
    // token
    res.headers[authKey] = Cookies.get(authKey)
  },

  /**
   * 请求成功回调
   * @param {Object} res
   */
  success: ({ data, config }, resolve, reject) => {
    if (config.whitelist) return resolve(data)

    const { code, message } = data
    // 操作正常Code数组
    const codeVerificationArray = isArray(successCode) ? [...successCode] : [...[successCode]]
    // 是否操作正常
    if (codeVerificationArray.includes(code)) {
      resolve(data)
    } else {
      // handleCode(code, message, data)
      reject(data)
    }
  },

  /**
   * 请求失败回调
   * @param {Object} res
   */
  error: res => {
    if (res) {
      // 代码
    }
  }
}

/**
 * 初始化request请求配置
 * 配置默认的请求方式
 * */
// 请求之前拦截器
setInterceptor(requestConfig.before, 'BEFORE')
setRequestConfig(requestConfig.config, requestConfig.servers)
// 请求成功拦截器
setInterceptor(requestConfig.success, 'SUCCESS')
// 请求失败拦截器
setInterceptor(requestConfig.error, 'ERROR')
